package com.pokermind.model.dto;

import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.Map;

/**
 * AI分析响应DTO - V4.10 最终版
 * 
 * 核心设计原则：只保留对玩家有用的数据
 * 
 * 响应结构：
 * - 基本信息：table_id, hand_id, player_id, seat_number
 * - success: 成功标识
 * - recommended_source: 推荐来源（ai/gto）
 * - gto: GTO 概率分布（fold/call/raise 的频率）
 * - ai: AI 具体决策（action/amount/confidence/reasoning）
 * - equity: 胜率（0-1）
 * - hand_strength: 手牌强度（0-1）
 * 
 * @author PokerMind Team
 * @version V4.10
 */
public class AIAnalysisResponse {
    
    // ========== 基本信息 ==========
    
    /**
     * 桌子ID
     */
    @JsonProperty("table_id")
    private String tableId;
    
    /**
     * 手牌ID
     */
    @JsonProperty("hand_id")
    private String handId;
    
    /**
     * 玩家ID
     */
    @JsonProperty("player_id")
    private String playerId;
    
    /**
     * 座位号
     */
    @JsonProperty("seat_number")
    private Integer seatNumber;
    
    // ========== 核心字段 ==========
    
    /**
     * 成功标识
     */
    private Boolean success;
    
    /**
     * 推荐来源（核心字段）
     * - "ai": 使用 ai 决策（AI 成功）
     * - "gto": 使用 gto 概率分布（AI 失败时的兜底）
     */
    @JsonProperty("recommended_source")
    private String recommendedSource;
    
    /**
     * GTO 概率分布
     * 格式：{"fold": 0.15, "call": 0.35, "raise": 0.50}
     * 
     * 含义：
     * - GTO 建议 15% 的时候弃牌
     * - GTO 建议 35% 的时候跟注
     * - GTO 建议 50% 的时候加注
     * 
     * 目的：让对手无法预测，保持混合策略
     */
    private Map<String, Double> gto;
    
    /**
     * AI 具体决策
     */
    private AIDecision ai;
    
    /**
     * 胜率（0-1）
     * 通过蒙特卡洛模拟计算
     */
    private Double equity;
    
    /**
     * 手牌强度（0-1）
     * 基于胜率计算，让玩家自己判断强度
     */
    @JsonProperty("hand_strength")
    private Double handStrength;
    
    // ========== 构造函数 ==========
    
    public AIAnalysisResponse() {}
    
    // ========== Getters and Setters ==========
    
    // 基本信息
    public String getTableId() { return tableId; }
    public void setTableId(String tableId) { this.tableId = tableId; }
    
    public String getHandId() { return handId; }
    public void setHandId(String handId) { this.handId = handId; }
    
    public String getPlayerId() { return playerId; }
    public void setPlayerId(String playerId) { this.playerId = playerId; }
    
    public Integer getSeatNumber() { return seatNumber; }
    public void setSeatNumber(Integer seatNumber) { this.seatNumber = seatNumber; }
    
    // 核心字段
    public Boolean getSuccess() { return success; }
    public void setSuccess(Boolean success) { this.success = success; }
    
    public String getRecommendedSource() { return recommendedSource; }
    public void setRecommendedSource(String recommendedSource) { this.recommendedSource = recommendedSource; }
    
    public Map<String, Double> getGto() { return gto; }
    public void setGto(Map<String, Double> gto) { this.gto = gto; }
    
    public AIDecision getAi() { return ai; }
    public void setAi(AIDecision ai) { this.ai = ai; }
    
    public Double getEquity() { return equity; }
    public void setEquity(Double equity) { this.equity = equity; }
    
    public Double getHandStrength() { return handStrength; }
    public void setHandStrength(Double handStrength) { this.handStrength = handStrength; }
    
    // ========== 内部类：AI 决策 ==========
    
    /**
     * AI 具体决策
     */
    public static class AIDecision {
        /**
         * 推荐行动：fold / call / raise / all-in
         */
        private String action;
        
        /**
         * 推荐金额（call 时为跟注额，raise 时为加注额，fold 时为 0）
         */
        private Integer amount;
        
        /**
         * 信心度（0-1）
         */
        private Double confidence;
        
        /**
         * 推理过程（一句话说明）
         */
        private String reasoning;
        
        // 构造函数
        public AIDecision() {}
        
        public AIDecision(String action, Integer amount, Double confidence, String reasoning) {
            this.action = action;
            this.amount = amount;
            this.confidence = confidence;
            this.reasoning = reasoning;
        }
        
        // Getters and Setters
        public String getAction() { return action; }
        public void setAction(String action) { this.action = action; }
        
        public Integer getAmount() { return amount; }
        public void setAmount(Integer amount) { this.amount = amount; }
        
        public Double getConfidence() { return confidence; }
        public void setConfidence(Double confidence) { this.confidence = confidence; }
        
        public String getReasoning() { return reasoning; }
        public void setReasoning(String reasoning) { this.reasoning = reasoning; }
    }
}
